perm filename PRODEC.SAI[HAL,HE] blob sn#119947 filedate 1974-09-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00023 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	DEFINE MAIN = ⊂ 0 ⊃, SUB = ⊂ 1 ⊃
C00004 00003	SIMPLE ETERNAL PROCEDURE INITIALIZE
C00005 00004	SIMPLE ETERNAL PROCEDURE ENTERBLOCK
C00006 00005	SIMPLE ETERNAL PROCEDURE NAMEBLOCK
C00007 00006	SIMPLE ETERNAL PROCEDURE EXITBLOCK
C00008 00007	SIMPLE ETERNAL PROCEDURE ERR
C00009 00008	SIMPLE ETERNAL PROCEDURE STORVAR
C00011 00009	ETERNAL PROCEDURE BEGFOR
C00012 00010	ETERNAL PROCEDURE BEGMOVE
C00013 00011	ETERNAL PROCEDURE BEGSEARCH
C00014 00012	SIMPLE ETERNAL PROCEDURE PUTIND
C00015 00013	ETERNAL PROCEDURE PUTEXPR
C00016 00014	SIMPLE ETERNAL PROCEDURE PUTINIT
C00017 00015	SIMPLE ETERNAL PROCEDURE PUTSTEP
C00018 00016	SIMPLE ETERNAL PROCEDURE PUTFINAL
C00019 00017	SIMPLE ETERNAL PROCEDURE PUTBODY
C00020 00018	ETERNAL PROCEDURE PUSHSTAT
C00021 00019	SIMPLE ETERNAL PROCEDURE POPSTAT
C00022 00020	SIMPLE ETERNAL PROCEDURE NEXSTAT
C00023 00021	ETERNAL PROCEDURE BEGASS
C00024 00022	SIMPLE ETERNAL PROCEDURE LEFTPART
C00025 00023	SIMPLE ETERNAL PROCEDURE RIGHTPART
C00031 ENDMK
C⊗;
DEFINE MAIN = ⊂ 0 ⊃, SUB = ⊂ 1 ⊃;
DEFINE ETERNAL = ⊂ IFC PROGRAM = MAIN THENC EXTERNAL ELSEC INTERNAL ENDC ⊃;
DEFINE PROCBODY = ⊂ IFC PROGRAM = SUB THENC ⊃;
ETERNAL BOOLEAN DEBUGPARSE;
DEFINE PARSEDEBUG = ⊂ IF DEBUGPARSE THEN OUTSTR ⊃;

define	sfor 	= ⊂ 1 ⊃,
	smove	= ⊂ 2 ⊃,
	ssearch = ⊂ 3 ⊃,
	swhile  = ⊂ 4 ⊃,
	sattach = ⊂ 5 ⊃,
	sass	= ⊂ 6 ⊃;
! etc...;

SIMPLE ETERNAL PROCEDURE INITIALIZE;
PROCBODY BEGIN
	parsedebug(crlf&tab&"Initializing main program");
	currblock ← mainprog ← new_record(block);
!	for i ← 0 step 1 until 63 do
		block:buck[i] ← bucket[i];
	block:code[mainprog]  ← new_record(stmnt);
	END;
ENDC
SIMPLE ETERNAL PROCEDURE ENTERBLOCK;
PROCBODY
	BEGIN
 	remember currblock,currtail in blockenv[blocktop];
	blocktop ← blocktop + 1;
	parsedebug(crlf&tab&"Enter new block level "&cvs(blocktop));
	if blocktop > maxblock then
		error("Blocks nested too deeply");
	currblock ← new_record(block); currtail ← block:code[currblock]
	END;
ENDC;
SIMPLE ETERNAL PROCEDURE NAMEBLOCK;
PROCBODY
	datum(block:name[currblock]) ← datum(entri:name[var0]);
ENDC	
SIMPLE ETERNAL PROCEDURE EXITBLOCK;
PROCBODY
	BEGIN
	parsedebug(crlf&tab&"Exit block level "&cvs(blocktop));
	if blocktop = 0 then
		error("Unexpected END");
	blocktop ← blocktop - 1;
	restore currblock, currtail from blockenv[blocktop]
	END;
ENDC
SIMPLE ETERNAL PROCEDURE ERR;
PROCBODY
	error("SYNTAX ERROR");
ENDC
SIMPLE ETERNAL PROCEDURE STORVAR;
PROCBODY
	BEGIN
	if entri:rtype[var0] ≠ tnondeclared
		∧ entri:blocklevel[var0] = blocktop then
		error("Duplicate declaration: "&datum(entri:name[var0]))
	else
		BEGIN
		string typnam;
		entri:blocklevel[var0] ← blocktop;
		typnam ← datum(entri:name[var1]);
		! TEMPORARY KLUDGE;
		if equ(typnam, "FRAME") then
			entri:rtype[var0]  ← tframe
		else if equ(typnam, "INTEGER") then 
			entri:rtype[var0]  ← tintvar
		else if equ(typnam, "SCALAR") then 
			entri:rtype[var0]  ← trealvar
		END
	END;
ENDC
ETERNAL PROCEDURE BEGFOR;
! BEG FOR SOME UNDERSTANDING FROM THAT HORRIBLE AND HEARTLESS AND HOSTILE AND
NASTY AND BUGGY AND EXHAUSTED AND IRRITABLE AND NONFRENCHSPEAKING AND SAILISH
SAIL COMPILER;
PROCBODY
	BEGIN
	stmnt:stype[currstat] ← sfor;
	stmnt:semantics[currstat] ←  new_record(forr)
	END;
ENDC	
ETERNAL PROCEDURE BEGMOVE;
PROCBODY
	BEGIN
	stmnt:stype[currstat] ← smove;
	stmnt:semantics[currstat] ← new_record(move$)
	END;
ENDC
ETERNAL PROCEDURE BEGSEARCH;
PROCBODY
	BEGIN
	stmnt:stype[currstat] ← ssearch;
	stmnt:semantics[currstat] ← new_record(search$)
	END;
ENDC
SIMPLE ETERNAL PROCEDURE PUTIND;
PROCBODY
	BEGIN
	if entri:rtype[var1] ≠ tintvar then
		error("Illegal type for FOR variable");
	forr:convar[stmnt:semantics[currstat]] ← var1
	END;
ENDC
ETERNAL PROCEDURE PUTEXPR;
PROCBODY
	BEGIN
	currexpr ← NEW_RECORD(exprn);
	exprn:datatype[currexpr] ← entri:rtype[var0];
!	if entri:rtype[var0] = tinteger then
		cell:car[exprn:args[currexpr]] ← entri:val[var0]
	else;
		cell:car[exprn:args[currexpr]] ← var0
	END;
ENDC
SIMPLE ETERNAL PROCEDURE PUTINIT;
PROCBODY
	forr:initial[stmnt:semantics[currstat]] ← currexpr;
ENDC

SIMPLE ETERNAL PROCEDURE PUTSTEP;
PROCBODY
	forr:convar[stmnt:semantics[currstat]] ← currexpr;
ENDC

SIMPLE ETERNAL PROCEDURE PUTFINAL;
PROCBODY
	forr:final[stmnt:semantics[currstat]] ← currexpr;
ENDC
SIMPLE ETERNAL PROCEDURE PUTBODY;
PROCBODY
	forr:body[stmnt:semantics[currstat]] ← oldcurrstat;
ENDC
ETERNAL PROCEDURE PUSHSTAT;
PROCBODY
	BEGIN
	remember currstat in statenv[stattop];
	stattop ← stattop + 1;
	if stattop > maxstat then
		error("Statements nested too deeply");
	currstat ← new_record(stmnt)
	END;
ENDC
SIMPLE ETERNAL PROCEDURE POPSTAT;
PROCBODY
	BEGIN
	stattop ← stattop - 1; if stattop < 0 then
		error("Statement stack underflow");
	oldcurrstat ← currstat;
	restore currstat from statenv[stattop]
	END;
ENDC
SIMPLE ETERNAL PROCEDURE NEXSTAT;
PROCBODY
	BEGIN
	currtail ← cell:cdr[currtail] ← new_record(cell);
	currstat ← cell:car[currtail] ← new_record(stmnt)
	END;
ENDC
ETERNAL PROCEDURE BEGASS;
PROCBODY
	BEGIN
	stmnt:stype[currstat] ← sass;
	stmnt:semantics[currstat] ← new_record(assign)
	END;
ENDC
SIMPLE ETERNAL PROCEDURE LEFTPART;
PROCBODY
	assign:var[stmnt:semantics[currstat]] ← var1;
ENDC
SIMPLE ETERNAL PROCEDURE RIGHTPART;
PROCBODY
	assign:val[stmnt:semantics[currstat]] ← currexpr;
ENDC